package sad.controle;

import sad.util.Constantes;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.util.Vector;
import sad.dao.DAO;
import sad.dao.DisciplinaTableDAO;
import sad.dao.TopicoTableDAO;
import sad.modelo.Disciplina;
import sad.modelo.Topico;
import sad.util.DAOEvent;
import sad.visao.CadTopicoDialog;
import sad.visao.DialogAbstrato;

public class TopicoControle extends AbstractControl {

  private CadTopicoDialog v_top;

  public TopicoControle(DialogAbstrato v) {
    this.v_top = (CadTopicoDialog)v;
    addOuvinte();
    initComponents();
  }
  
// <editor-fold defaultstate="collapsed" desc="Responde a eventos com origem nas visões">
    @Override
    public void actionPerformed(ActionEvent e) {
        
        if(e.getActionCommand().equals(Constantes.SALVAR_TOPICO)){
            createTopico();
        }else {
            if(e.getActionCommand().equals(Constantes.EXCLUIR)){
                removeTopico();
            }
            if(e.getActionCommand().equals(Constantes.UPDATE)){
                updateTopico();
            }
            TopicoTableDAO.getInstance().removeDAOOuvinte(this);
            v_top.close();
        }
    }

    @Override
    public void windowClosing(WindowEvent e){
        switch(e.getID()){
           case WindowEvent.WINDOW_CLOSING:
                TopicoTableDAO.getInstance().removeDAOOuvinte(this);
                v_top.close();
                break;
        }
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Enchaminha eventos com origem no DAO">
    @Override
    public void daoChange(DAOEvent e) {
           v_top.modelDAOChange(e);
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Métodos privados + CRUD">
    private void addOuvinte() {
        //add este controle como ouvinte da janela(v_disc) por isso parece
        //redundante na SADGUI, mas não é...
        v_top.addActionListener(this);
        v_top.addWindowOuvinte(this);
        TopicoTableDAO.getInstance().addDAOOuvinte(this);
    }

    private void initComponents() {
       Object[] listObjects = DAO.getListObjects(Disciplina.class);
       Vector<String> d = new Vector<String>();
       if (listObjects.length!=0){
           for (int i = 0; i < listObjects.length; i++) {
                Disciplina disc = (Disciplina) listObjects[i];
                d.add(disc.getNome()+"/"+disc.getAbrev());
           }
           v_top.reload(d);
       }
    }
    
    private void createTopico() {
            String nome  = v_top.getNome();
            String abrev = v_top.getAbreviatura();
            String disc = v_top.getDisciplina();
            
            if(verificarOK(nome, abrev, disc, 0)) {
                Disciplina d = DisciplinaTableDAO.getDisciplinaSaved(disc);
                TopicoTableDAO.getInstance().create(nome, abrev, d);
            }  
     }
    
    private void removeTopico() {
        TopicoTableDAO.getInstance().removeTopico();
    }

    private void updateTopico() {
            String nome  = v_top.getNome();
            String abrev = v_top.getAbreviatura();
            String disc = v_top.getDisciplina();

            if(verificarOK(nome, abrev, disc, 1)){
                Disciplina disci = DisciplinaTableDAO.getDisciplinaSaved(disc);
                Topico top = TopicoTableDAO.getTopicoSaved(abrev);
                top.setNome(nome);
                top.setDisc(disci);
                TopicoTableDAO.getInstance().update(top);
            }
    }

    private boolean verificarOK(String nome, String abrev, String disc,  int tipo) {
            boolean ok = false;
            if (nome.equals("")){
                TopicoTableDAO.getInstance().erroField(nome, Constantes.NOME_TOPICO);
            }else {
                if (abrev.equals("")){
                    TopicoTableDAO.getInstance().erroField(abrev, Constantes.ABREV_TOPICO);
                }else{
                      if (disc.equals("<Lista vazia>")){
                           TopicoTableDAO.getInstance().erroField(disc, Constantes.DISCIPLINA);
                      }else{
                          if(tipo == 0){
                              if(!TopicoTableDAO.getInstance().isExist(abrev)) {
                                ok=true;
                            }
                          }else{
                           ok=true;   
                          }
                    }  
                }
            }
            return ok;
    }// </editor-fold>
}